#include "modulemanifest.h"
#include <QFileInfo>
#include <QDir>
#include <QDomDocument>

ModuleManifest::ModuleManifest(QObject *parent) :
    QObject(parent)
{
}

bool ModuleManifest::Load(const QString ModuleDirectory)
{
    try
    {
        QDir moduleDir( ModuleDirectory );
        if ( !moduleDir.exists() )
        {
            lastError = tr("Указанный каталог %1 не найден.").arg(ModuleDirectory);
            return false;
        }

        // Загрузка манифеста
        manifestPath = moduleDir.filePath("manifest.xml");
        if ( !loadManifest() )
            return false;
    }
    catch(...)
    {
        lastError = tr("Неизвестная ошибка при загрузке модуля.");
        return false;
    }

    return true;
}

bool ModuleManifest::loadManifest()
{
    QFile manifestFile( manifestPath );
    if ( !manifestFile.exists() )
    {
        lastError = tr("Отсутствует файл манифеста.");
        return false;
    }

    if ( !manifestFile.open(QIODevice::ReadOnly) )
    {
        lastError = tr("Ошибка чтения файла манифеста (%1).").arg(manifestFile.fileName());
        return false;
    }

    // Загрузка XML
    if ( !loadXML(&manifestFile) )
    {
        manifestFile.close();
        return false;
    }

    manifestFile.close();
    return true;
}

bool ModuleManifest::loadXML(QFile *XmlFile)
{
    // Загрузка XML
    QDomDocument manifestXmlDoc;
    if ( !manifestXmlDoc.setContent(XmlFile) )
    {
        lastError = tr("Ошибка загрузки Xml манифеста (%1).").arg(XmlFile->fileName());
        return false;
    }

    QDomElement manifestRootXmlNode = manifestXmlDoc.documentElement();
    QDomElement xmlNode = manifestRootXmlNode.firstChildElement("Name");
    if ( xmlNode.isNull() )
    {
        lastError = tr("Некорректный файл манифеста (%1). Отсутствует узел %2.").arg(XmlFile->fileName()).arg("Name");
        return false;
    }
    name = xmlNode.text();

    xmlNode = manifestRootXmlNode.firstChildElement("Version");
    if ( xmlNode.isNull() )
    {
        lastError = tr("Некорректный файл манифеста (%1). Отсутствует узел %2.").arg(XmlFile->fileName()).arg("Version");
        return false;
    }
    version = xmlNode.text();

    xmlNode = manifestRootXmlNode.firstChildElement("AppName");
    if ( xmlNode.isNull() )
    {
        lastError = tr("Некорректный файл манифеста (%1). Отсутствует узел AppName.").arg(XmlFile->fileName());
        return false;
    }
    QString appName = xmlNode.text();

    QFileInfo fileinfo(*XmlFile);
    path = fileinfo.dir().absoluteFilePath(appName);

    // Настройки
    xmlNode = manifestRootXmlNode.firstChildElement("Settings");
    for(QDomElement xmlS = xmlNode.firstChildElement(); !xmlS.isNull(); xmlS = xmlS.nextSiblingElement())
    {
        node_settings ns;
        ns.visible = xmlS.attribute("visible");
        ns.label = xmlS.attribute("label");
        ns.value = xmlS.text();
        ns.node_name = xmlS.nodeName();

        settings.append(ns);
    }

    return true;
}

const QString ModuleManifest::Name()
{
    return name;
}

const QString ModuleManifest::Version()
{
    return version;
}

const QString ModuleManifest::Path()
{
    return path;
}

const QString ModuleManifest::ManifestPath()
{
    return manifestPath;
}

const QString ModuleManifest::LastError()
{
    return lastError;
}

const SettingsList ModuleManifest::Settings()
{
    return settings;
}

void ModuleManifest::SetEnabled(const bool Enabled)
{
    enabled = Enabled;
}

bool ModuleManifest::Enabled()
{
    return enabled;
}
